package plp.orientadaObjetos2.comando;

import plp.expressions2.memory.VariavelJaDeclaradaException;
import plp.expressions2.memory.VariavelNaoDeclaradaException;
import plp.orientadaObjetos1.excecao.declaracao.ClasseJaDeclaradaException;
import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException;
import plp.orientadaObjetos1.excecao.declaracao.ObjetoJaDeclaradoException;
import plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException;
import plp.orientadaObjetos1.excecao.declaracao.ProcedimentoJaDeclaradoException;
import plp.orientadaObjetos1.excecao.declaracao.ProcedimentoNaoDeclaradoException;
import plp.orientadaObjetos1.excecao.execucao.EntradaInvalidaException;
import plp.orientadaObjetos1.expressao.Expressao;

public abstract class AbstractComandoHandler implements ComandoReflectionHandler {
	
	private ComandoReflectionHandler proximo;
	
	public final void setProximo(ComandoReflectionHandler proximo){
		this.proximo = proximo;
	} 
	
	public final void comandoHandler(ComandoBean comandoBean) throws ClasseNaoDeclaradaException,
	VariavelNaoDeclaradaException, VariavelJaDeclaradaException, ObjetoNaoDeclaradoException, ClasseJaDeclaradaException, ObjetoJaDeclaradoException, 
	ProcedimentoNaoDeclaradoException, ProcedimentoJaDeclaradoException, EntradaInvalidaException{
		if(aceita(comandoBean.getComando())){
			manipula(comandoBean);
		}else if(this.proximo != null){
			this.proximo.comandoHandler(comandoBean);
		}
	}
	
	public abstract boolean aceita(Expressao comando);
	public abstract void manipula(ComandoBean comandoBean) throws ClasseNaoDeclaradaException,
	VariavelNaoDeclaradaException, VariavelJaDeclaradaException, ObjetoNaoDeclaradoException, ClasseJaDeclaradaException, ObjetoJaDeclaradoException, 
	ProcedimentoNaoDeclaradoException, ProcedimentoJaDeclaradoException, EntradaInvalidaException;

}
